home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 October: Mac OS SDK / Dev.CD Oct 97 SDK1.toast / Development Kits (Disc 1) / ColorSync SDK / Sample Code / Procedure Profile / ProcedureProfile.c next >
Encoding:
Text File  |  1997-06-13  |  9.4 KB  |  395 lines  |  [TEXT/MMCC]

  1. // An example of using ColorSync 2.1 procedure-based profiles
  2. // to read and write to resource profiles
  3. //
  4. // Copyright 1996, Apple Computer,Inc
  5. //
  6.  
  7.  
  8. #ifndef __STDIO__
  9. #include <Stdio.h>
  10. #endif 
  11. #ifndef __TYPES__
  12. #include <Types.h>
  13. #endif
  14. #ifndef __TRAPS__
  15. #include <Traps.h>
  16. #endif
  17. #ifndef __CMAPPLICATION__
  18. #include <CMApplication.h>
  19. #endif
  20. #ifndef __RESOURCES__
  21. #include <Resources.h>
  22. #endif
  23. #ifndef __FOLDERS__
  24. #include <Folders.h>
  25. #endif
  26.  
  27. #ifndef __PROCEDUREPROFILE__
  28. #include "ProcedureProfile.h"
  29. #endif
  30.  
  31.  
  32. //===========================================================
  33. // PRIVATE STRUCTURE TYPEDEFS
  34. //===========================================================
  35.  
  36. struct MyResourceLocRec
  37. {
  38.     FSSpec                resFileSpec ;
  39.     ResType                resType ;
  40.     short                resID ;
  41.     short                resFileRef ;
  42.     Handle                resHandle ;
  43.     CMProfileAccessUPP    proc ;
  44.     Str255                resName ;
  45. };
  46.     
  47. typedef struct MyResourceLocRec MyResourceLocRec, *MyResourceLocPtr ;
  48.  
  49.  
  50. //===========================================================
  51. // PRIVATE FUNCTION PROTOTYPES
  52. //===========================================================
  53.  
  54. static pascal OSErr MyProcedureProfileProc(long command, long offset, long *sizePtr, void *dataPtr, void* refConPtr) ;
  55.  
  56. static OSErr DoBeginAccess            ( void* refCon) ;
  57. static OSErr DoCreateNewAccess        ( void* refCon);
  58. static OSErr DoOpenReadAccess        ( void* refCon);
  59. static OSErr DoOpenWriteAccess        ( long* setProfileSize, void* refCon);
  60. static OSErr DoReadAccess            ( long offset, long* sizePtr, void* dataPtr, void* refCon);
  61. static OSErr DoCloseAccess            ( void* refCon);
  62. static OSErr DoWriteAccess            ( long offset, long* sizePtr, void* dataPtr, void* refCon);
  63. static OSErr DoAbortWriteAccess        ( void* refCon);
  64. static OSErr DoEndAccess            ( void* refCon);
  65.  
  66.  
  67. //===========================================================
  68. // PUBLIC FUNCTIONS
  69. //===========================================================
  70.  
  71.  
  72. /*------------------------------------------------------------------------------*\
  73.     CreateProcedureProfileLoc
  74.  *------------------------------------------------------------------------------*
  75.         This routine set up a procedure-based ProfileLocation structure that 
  76.         can be used to acess profiles in resources.
  77.  
  78.          profileLocation        On input a pointer to the CMProfileLocation structure 
  79.                              to fill in.
  80.          resourceSpec        File spec ptr of the resource file to create.
  81.          resourceName        Name of the resource.
  82.          resourceType        Type of the resource.
  83.          resourceID            ID of the resource.
  84. \*------------------------------------------------------------------------------*/
  85. OSErr CreateProcedureProfileAccess( CMProfileLocation* profileLocation, FSSpec *resourceSpec,
  86.                                     Str255 resourceName, OSType resourceType, short resourceID)
  87. {
  88.       OSErr                err = noErr;
  89.     MyResourceLocPtr    resourceInfo ;
  90.     
  91.     // allocate memory for our private resource info structure
  92.     resourceInfo = (MyResourceLocPtr) NewPtrClear( sizeof(MyResourceLocRec) ) ;
  93.     if (!resourceInfo)
  94.         err = MemError();
  95.         
  96.     if (!err)
  97.     {
  98.         // set up our private resource info structure
  99.         resourceInfo->resFileSpec = *resourceSpec ;
  100.         resourceInfo->resType = resourceType ;
  101.         resourceInfo->resID = resourceID ;
  102.         resourceInfo->resFileRef = 0 ;
  103.         resourceInfo->resHandle = 0 ;
  104.         resourceInfo->proc = NewCMProfileAccessProc(MyProcedureProfileProc);
  105.         if (resourceName)
  106.             BlockMoveData(resourceName, resourceInfo->resName, resourceInfo->resName[0]);
  107.         
  108.         // set up the profile location structure
  109.         profileLocation->locType = cmProcedureBasedProfile ;
  110.         profileLocation->u.procLoc.refCon = (void*)resourceInfo ;
  111.         profileLocation->u.procLoc.proc = resourceInfo->proc ;
  112.     }
  113.     
  114.     return err;
  115. }
  116.  
  117.  
  118. /*------------------------------------------------------------------------------*\
  119.     DisposeProcedureProfileAccess
  120.  *------------------------------------------------------------------------------*
  121.         This routine disposes of any data allocated by CreateProcedureProfileLoc.
  122.  
  123.          profileLocation        On input, a pointer to the CMProfileLocation structure 
  124.                              to dispose of.
  125. \*------------------------------------------------------------------------------*/
  126. void DisposeProcedureProfileAccess( CMProfileLocation *profileLocation )
  127. {
  128.     DisposeRoutineDescriptor( profileLocation->u.procLoc.proc );
  129.  
  130.     // dispose of our private resource info structure
  131.      DisposePtr( (Ptr)profileLocation->u.procLoc.refCon );
  132. }
  133.  
  134.  
  135. //===========================================================
  136. // PRIVATE FUNCTIONS
  137. //===========================================================
  138.  
  139. static pascal OSErr MyProcedureProfileProc(long command, long offset, long *sizePtr, void *dataPtr, void* refConPtr)
  140. {
  141.       OSErr                err = noErr;
  142.     switch (command)
  143.     {
  144.         case cmBeginAccess:
  145.             err = DoBeginAccess(refConPtr) ;
  146.             break ;
  147.             
  148.         case cmCreateNewAccess:
  149.             err = DoCreateNewAccess(refConPtr);
  150.             break ;
  151.         
  152.         case cmOpenReadAccess:
  153.             err = DoOpenReadAccess(refConPtr) ;
  154.             break ;
  155.         
  156.         case cmOpenWriteAccess:
  157.             err = DoOpenWriteAccess(sizePtr, refConPtr) ;
  158.             break ;
  159.             
  160.         case cmReadAccess:
  161.             err = DoReadAccess(offset, sizePtr, dataPtr, refConPtr);
  162.             break ;
  163.             
  164.         case cmWriteAccess:
  165.             err = DoWriteAccess(offset, sizePtr, dataPtr, refConPtr);
  166.             break ;
  167.         
  168.         case cmCloseAccess:
  169.             err = DoCloseAccess(refConPtr);
  170.             break ;
  171.         
  172.         case cmAbortWriteAccess:
  173.             err = DoAbortWriteAccess(refConPtr);
  174.             break ;
  175.         
  176.         case cmEndAccess:
  177.             err = DoEndAccess(refConPtr);
  178.             break ;
  179.         
  180.         default:
  181.             err = paramErr;
  182.             break ;
  183.     }
  184.  
  185.     return err ;
  186. }
  187.  
  188.  
  189. static OSErr DoCreateNewAccess ( void* refcon )
  190. {
  191.       OSErr                err;
  192.      MyResourceLocPtr    resourceInfo = refcon;
  193.      
  194.     FSpCreateResFile(  &(resourceInfo->resFileSpec), '????', 'rprf', 0);
  195.     err = ResError() ;
  196.     if (err == dupFNErr)
  197.         err = noErr;
  198.         
  199.      return err;
  200. }
  201.  
  202.  
  203. static OSErr DoBeginAccess ( void* refcon )
  204. {
  205.      OSErr                err;
  206.      MyResourceLocPtr    resourceInfo = refcon;
  207.     
  208.     resourceInfo->resFileRef = 0 ;
  209.  
  210.     if ( resourceInfo->resType != kProcResourceType)
  211.         err = cmInvalidProfileLocation ;
  212.     else
  213.         err = noErr;
  214.     
  215.     return err;    
  216. }
  217.  
  218.  
  219. static OSErr DoOpenReadAccess ( void* refcon )
  220. {
  221.      OSErr                err;
  222.      MyResourceLocPtr    resourceInfo = refcon;
  223.     short                currentResFile ;
  224.     
  225.     currentResFile = CurResFile() ;
  226.     
  227.      // open the file's resource fork
  228.     resourceInfo->resFileRef = FSpOpenResFile( &(resourceInfo->resFileSpec), fsRdPerm);
  229.     err = ResError();
  230.     
  231.      // load the resource with ResLoad false
  232.     if (!err)
  233.     {
  234.         SetResLoad(false) ;
  235.         resourceInfo->resHandle = GetResource( resourceInfo->resType, resourceInfo->resID );
  236.         err = ResError() ;
  237.         SetResLoad(true);
  238.     }
  239.  
  240.     UseResFile(currentResFile);
  241.     
  242.     return err;
  243. }
  244.  
  245.  
  246. static OSErr DoOpenWriteAccess( long* setProfileSize, void* refcon ) 
  247. {
  248.      OSErr                err;
  249.      MyResourceLocPtr    resourceInfo = refcon;
  250.     Size                resourceSize ;
  251.     short                currentResFile ;
  252.     
  253.     currentResFile = CurResFile() ;
  254.  
  255.      // open the file's resource fork
  256.      resourceInfo->resFileRef = FSpOpenResFile( &(resourceInfo->resFileSpec), fsRdWrPerm);
  257.      err = ResError() ;
  258.      
  259.      // load the resource with ResLoad false
  260.     if (!err)
  261.     {
  262.         SetResLoad(false) ;
  263.         resourceInfo->resHandle = GetResource( resourceInfo->resType, resourceInfo->resID );
  264.         err = ResError() ;
  265.         SetResLoad(true);
  266.     }
  267.     
  268.     // call GetResourceSizeOnDisk to see is there alread is a resource there
  269.     if (!err)
  270.     {
  271.         resourceSize = GetResourceSizeOnDisk(resourceInfo->resHandle); /* get size of the resource */
  272.         err = ResError();
  273.     }
  274.     
  275.     // if the above call to GetResourceSizeOnDisk returns resNotFound
  276.     // the we need to create a new resource
  277.     if ( err==resNotFound )
  278.     {
  279.         // allocate a temporary handle just so that we can call AddResource
  280.          resourceInfo->resHandle = NewHandle(sizeof(long));
  281.          err = MemError() ;
  282.          
  283.          // add resource to the file an relase the temp handle
  284.          if (!err)
  285.          {
  286.             AddResource( resourceInfo->resHandle, resourceInfo->resType, 
  287.                          resourceInfo->resID, resourceInfo->resName );
  288.             err = ResError();
  289.             ReleaseResource(resourceInfo->resHandle);
  290.         }
  291.         
  292.          // reload the resource with ResLoad false
  293.         if (!err)
  294.         {
  295.             SetResLoad(false) ;
  296.             resourceInfo->resHandle = GetResource( resourceInfo->resType, resourceInfo->resID );
  297.             err = ResError() ;
  298.             SetResLoad(true);
  299.         }
  300.     }
  301.  
  302.     // change the resource size
  303.     if (!err)
  304.     {
  305.         SetResourceSize( resourceInfo->resHandle, *setProfileSize);
  306.         err = ResError();
  307.     }
  308.     
  309.     // force an update of the resource file
  310.     if (!err)
  311.     {
  312.         UpdateResFile( resourceInfo->resFileRef);
  313.         err = ResError();
  314.     }
  315.     
  316.     UseResFile(currentResFile);
  317.     
  318.     return err;
  319. }
  320.  
  321.  
  322. static OSErr DoReadAccess(long offset, long* sizePtr, void* dataPtr, void* refcon )
  323. {
  324.  
  325.      OSErr                err;
  326.      MyResourceLocPtr    resourceInfo = refcon;
  327.     
  328.     ReadPartialResource(resourceInfo->resHandle, offset, dataPtr, *sizePtr) ;
  329.     err = ResError() ;
  330.     
  331.     return err;
  332. }
  333.  
  334.  
  335. static OSErr DoWriteAccess (long offset, long* sizePtr, void* dataPtr, void* refcon)
  336. {
  337.      OSErr                err;
  338.      MyResourceLocPtr    resourceInfo = refcon;
  339.     
  340.     WritePartialResource(resourceInfo->resHandle, offset, dataPtr, *sizePtr);
  341.     err = ResError();
  342.  
  343.     return err;
  344. }
  345.  
  346.  
  347. static OSErr DoAbortWriteAccess ( void* refcon )
  348. {
  349.      OSErr                err;
  350.      MyResourceLocPtr    resourceInfo = refcon;
  351.     
  352.     // delete the resource that we started
  353.     if (resourceInfo->resHandle)
  354.     {
  355.         RemoveResource(resourceInfo->resHandle);
  356.         err = ResError();
  357.     }
  358.     else err = paramErr;
  359.     
  360.     return err;
  361. }
  362.  
  363.  
  364. static OSErr DoCloseAccess ( void* refcon )
  365. {
  366.      OSErr                err;
  367.      MyResourceLocPtr    resourceInfo = refcon;
  368.     
  369.     // close and update resource file
  370.     if (resourceInfo->resFileRef)
  371.     {     
  372.         CloseResFile( resourceInfo->resFileRef ) ;
  373.         err = ResError() ;
  374.         resourceInfo->resFileRef = 0 ;
  375.     }
  376.     else err = paramErr;
  377.     
  378.     return err;
  379. }    
  380.  
  381.  
  382. static OSErr DoEndAccess (void* refcon)
  383. {
  384.      OSErr                err;
  385.       MyResourceLocPtr    resourceInfo = refcon;
  386.      
  387.      err = noErr;
  388.      
  389.      return err;
  390. }
  391.  
  392.  
  393.  
  394.  
  395.